<!DOCTYPE html>
<html lang="en">

<head>
    <meta charset="utf-8">
    <meta name="viewport" content="maximum-scale=1.0,minimum-scale=1.0,user-scalable=0,width=device-width,initial-scale=1.0"
    />
    <title>代理模式</title>
</head>

<body>
    <h2>书籍：《javascript设计模式与开发实践》</h2>
    <p>代理 B 可以帮助 A 过滤掉一些请求，比如送花的人中年龄太大的或者没有宝马的，这种请求就可以直接在代理 B 处被拒绝掉。这种代理叫作保护代理。A 和 B 一个充当白脸，一个充当黑脸。白脸 A 继续保持 良好的女神形象，不希望直接拒绝任何人，于是找了黑脸B来控制对 A的访问。</p>
    <h3>假设现实中的花价格不菲，导致在程序世界里， new Flower 也是一个代价昂贵的操作， 那么我们可以把 new Flower 的操作交给代理 B 去执行，代理 B 会选择在 A 心情好时再执行 new Flower ，这是代理模式的另一种形式，叫作虚拟代理。虚拟代理把一些开销很大的对象，延迟到
    真正需要它的时候才去创建。</h3>
    <script type="text/javascript">
        function Flow() {
            this.name = 'flow'
        }
        var xiaoming = {
            sendFlow: function (target) {
                target.proxysendFlow()
            }
        }
        var A = {
            name:'a',
            receiveFlow: function (flow) {
                console.log(this.name + ' 收到花 ' + flow.name)
            },
            listenGoodMood:function(fn){
                setTimeout(() => {
                    console.log("假设5秒之后心情很好,此时可以送花了")
                    fn()
                }, 5000);
            }
        }
        var B = {
            name:'b',
            proxysendFlow:function () {
                A.listenGoodMood(function(){
                    var newFlow = new Flow() // 虚拟代理
                    A.receiveFlow(newFlow) // 送花，A即收到
                })
            }
        }
        xiaoming.sendFlow(B)
    </script>

</body>

</html>